#include "comm.hpp"

int main()
{
    key_t k = getKey();
    printf("0x%x\n",k);
    
    int shmid = createShm(k);
    printf("shmid: %d\n", shmid);
    //到这一步一定是共享内存创建成功了，因为在getKey()createShm()各自函数内部都进行了查错处理。
    
    // sleep(5);
    char *start = (char*)attachshm(shmid);//让进程和共享内存进行挂接，返回共享内存的起始地址
    printf("attach success, address start: %p\n", start);

    //挂载成功后进行通信
    while (true)
    {
        printf("client say: %s\n", start);
        struct shmid_ds ds;
        shmctl(shmid, IPC_STAT, &ds);
        printf("获取属性: size: %d, pid: %d, myself: %d, key: 0x%x",ds.shm_segsz, ds.shm_cpid, getpid(), ds.shm_perm.__key);
        sleep(1);//每隔一秒从shm中读取一次
        // SHM_RDONLY;
    } 

    // sleep(5);
    // detach去关联之后再进行共享内存的删除，不要直接删除。  
    // 去关联并不是删除shm，而是将虚拟地址和共享内存的关联去掉，说白了就是修改页表，回收虚拟地址空间中的虚拟地址start，把start地址的使用权还给OS
    // 和free malloc开辟出来的空间地址一个道理，都是把地址的使用权还给操作系统。
    detachshm(start);

    // sleep(10);//保证两个进程同时运行的时候，一定是server最后删除shm

    //删除共享内存
    delShm(shmid);//奉行的原则是谁创建，谁删除。
    return 0;
}

// while :; do ipcs -m; sleep 1; done --> 查看共享内存资源的脚本